package com.util;

/**
 * 将二维数组转换为稀疏数组的方法
 */
public class SparseArray {
    public static int[][] SparseOutput(int [][] chessArray) {
        //赋值
        chessArray[2][3] = 7;
        chessArray[2][4] = 7;
        chessArray[2][5] = 7;
        //将这个二维数组转换为稀疏数组
        //1获取到数组中所有非0数字的个数,这个就是稀疏数组的行高+1
        int sum = 0;
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray.length; j++) {
                if (chessArray[i][j] != 0) {
                    sum++;
                }
            }
        }

        //可以初始化定义稀疏数组了，得到了行和列，稀疏数组的列一定是3
        int[][] sparseArray = new int[sum + 1][3];
        //稀疏数组的第一行用来存储原始数组的行和列还有非0数据个数
        sparseArray[0][0] = 8;
        sparseArray[0][1] = 8;
        sparseArray[0][2] = sum;

        /*进行赋值，这里是难点，建议多敲多练
        因为我们的第一行已经用来存储原始数组的数据了，
        所有我们循环时要从第二行开始赋值
        我们需要一个初始值，来指定它的行数，每次循环进行++
        */
        int count = 0;
        for (int i = 1; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray.length; j++) {
                if (chessArray[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chessArray[i][j];
                }
            }
        }

        //现在我们可以看一下这个稀疏数组了
        for (int i = 0; i < sparseArray.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n",
                    sparseArray[i][0],
                    sparseArray[i][1],
                    sparseArray[i][2]);
        }

        return sparseArray;
    }

}
